home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / doom / doom_16t.3 / doom_16t / sndcvt / sndcvt.c < prev    next >
C/C++ Source or Header  |  1995-01-16  |  3KB  |  157 lines

  1. /* sndcvt.c    -  Charles (int@link.xs4all.nl)
  2. **
  3. ** convert 16bit sound of DOOM to 8bit ..
  4. **
  5. ** (10sep94) initial version
  6. ** (15sep94) added support for pcsp
  7. ** (17jan95) last version (hopefully 8bit support is included in the next sndserver)
  8. */
  9.  
  10. #include <stdio.h>
  11. #include <unistd.h>
  12. #include <fcntl.h>
  13. #include <errno.h>
  14. #include <sys/types.h>
  15. #include <sys/ioctl.h>
  16. #include <sys/soundcard.h>
  17.  
  18. #define ERRMSG          strerror(errno)
  19. #define DSP_IN          "/tmp/dsp"
  20. #define DSP_OUT       "/dev/dsp"
  21. #define PCSP_OUT      "/dev/pcsp"
  22.  
  23. void do_sndcvt(int,int);
  24. void usage(void);
  25.  
  26. int Fs=0,Fm=0,Fp=0;
  27.  
  28.  
  29. void main(int argc, char **argv)
  30. {
  31.   char    *dspin    = DSP_IN;
  32.   char    *dspout = NULL;
  33.   int     ifd, ofd;
  34.   int     c, v, ret;
  35.  
  36.      if(argc<2)
  37.        usage();
  38.  
  39.      while((c=getopt(argc, argv, "smpi:o:")) != -1)
  40.       {
  41.     switch(c)
  42.      {
  43.        case 's':
  44.         Fs++;
  45.         if(!dspout)
  46.           dspout = DSP_OUT;
  47.         break;
  48.        case 'm':
  49.         Fm++;
  50.         if(!dspout)
  51.           dspout = DSP_OUT;
  52.         break;
  53.        case 'p':
  54.         Fp++;
  55.         if(!dspout)
  56.           dspout = PCSP_OUT;
  57.         break;
  58.        case 'i':
  59.         dspin = optarg;
  60.         break;
  61.        case 'o':
  62.         dspout = optarg;
  63.         break;
  64.        default:
  65.         usage();
  66.      }
  67.       }
  68.  
  69.      ifd = open(dspin, O_RDONLY);
  70.      if(ifd < 0)
  71.        {
  72.       fprintf(stderr, "Can't open %s (rd): %s\n", dspin, ERRMSG);
  73.       exit(1);
  74.        }
  75.  
  76.      if(!dspout)
  77.        dspout = DSP_OUT;
  78.      ofd = open(dspout, O_WRONLY);
  79.      if(ofd < 0)
  80.        {
  81.       fprintf(stderr, "Can't open %s (wr): %s\n", dspout, ERRMSG);
  82.       exit(1);
  83.        }
  84.  
  85.      if(Fm || Fs)
  86.        {
  87.       v = 131083;
  88.       ret = ioctl(ofd, SNDCTL_DSP_SETFRAGMENT, &v);
  89.       if(ret) perror("SNDCTL_DSP_SETFRAGMENT");
  90.  
  91.       v = Fs ? 1 : 0;
  92.       ret = ioctl(ofd, SNDCTL_DSP_STEREO, &v);
  93.       if(ret) perror("SNDCTL_DSP_STEREO");
  94.        }
  95.  
  96.      ret = ioctl(ofd, SNDCTL_DSP_RESET, 0);
  97.      if(ret) perror("SNDCTL_DSP_RESET");
  98.  
  99.      v = 11025;
  100.      ret = ioctl(ofd, SOUND_PCM_WRITE_RATE, &v);
  101.      if(ret) perror("SOUND_PCM_WRITE_RATE");
  102.  
  103.      do_sndcvt(ifd, ofd);
  104.  
  105.   fprintf(stderr, "sndcvt: EOF\n");
  106.   exit(0);
  107. }
  108.  
  109. void do_sndcvt(int ifd, int ofd)
  110. {
  111.   unsigned short s[1024];
  112.   unsigned char  b[1024];
  113.   int         i, j;
  114.   int         cnt;
  115.  
  116.      while((cnt = read(ifd, &s, 2048)))
  117.       {
  118.  
  119.     if(Fs)
  120.       {
  121.          cnt /= 2;
  122.          for(i=0;i<cnt;i++)
  123.            {
  124.           s[i] ^= 0x8000;
  125.           b[i]    = (s[i]>>8);
  126.            }
  127.       }
  128.     else
  129.       {
  130.          cnt /= 2;
  131.          for(i=0,j=0;i<cnt;i++,j++)
  132.            {
  133.           s[i] = ((s[i] ^ 0x8000) + (s[++i] ^ 0x8000)) / 2;
  134.           b[j] = (s[i]>>8);
  135.            }
  136.       }
  137.  
  138.     if(write(ofd, &b, cnt) != cnt)
  139.      {
  140.        fprintf(stderr, "sndcvt: short write: %s\n", ERRMSG);
  141.        exit(1);
  142.      }
  143.       }
  144. }
  145.  
  146. void usage(void)
  147. {
  148.   fprintf(stderr, "sndcvt v3 - convert DOOM's 16bit sound to 8bit - Charles (int@link.xs4all.nl)\n");
  149.   fprintf(stderr, "usage: sndcvt <[-smp]> [-i in] [-o out]\n\n");
  150.   fprintf(stderr, "      -s       stereo dsp\n");
  151.   fprintf(stderr, "      -m       mono dsp\n");
  152.   fprintf(stderr, "      -p       mono pcsp\n");
  153.   fprintf(stderr, "      -i<dev>  input fifo\n");
  154.   fprintf(stderr, "      -o<dev>  output device\n");
  155.   exit(1);
  156. }
  157.